<?php

namespace app\admin\controller;

use app\admin\controller\system\Push;
use app\admin\model\SystemAdmin;
use app\admin\model\SystemQuick;
use app\common\controller\AdminController;
use app\Request;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Db;
use app\admin\model\WorkAttendanceStatistics;
use think\facade\Log;

class Index extends AdminController
{

    /**
     * 后台主页
     * @param Request $request
     * @return string
     */
    public function index(Request $request): string
    {
        return $this->fetch('', ['admin' => $request->adminUserInfo,]);
    }

    /**
     * 后台欢迎页
     * @return string
     * @throws Exception
     */
    public function welcome(): string
    {
        $tpVersion    = \think\facade\App::version();
        $mysqlVersion = Db::query("select version() as version")[0]['version'] ?? '未知';
        $phpVersion   = phpversion();
        $versions     = compact('tpVersion', 'mysqlVersion', 'phpVersion');
        $quick_list   = SystemQuick::field('id,title,icon,href')
            ->where(['status' => 1])->order('sort', 'desc')->limit(50)->select()->toArray();
        $quicks       = array_chunk($quick_list, 8);
        $month = date("Y-m");
        $model = WorkAttendanceStatistics::where("statistics_date", $month . '-01')->findOrEmpty();
        if ($model->isEmpty()) {
            $model = new WorkAttendanceStatistics();
        }
        $msg = $month . " 出勤";
        $week = $this->week();
        $wnl = $this->wnl();
        $gzDate = $wnl["gzDate"];
        $class = "layui-card-body";
        $array = ["寅日", '巳日', '申日', '亥日'];
        if (in_array($gzDate, $array)) {
            $class = "layui-card-body layui-font-red";
        }
        $this->assign(compact('quicks', 'versions', 'msg', 'model', 'week', 'wnl', 'class'));
        return $this->fetch();
    }

    /**
     * 修改管理员信息
     * @param Request $request
     * @return string
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public function editAdmin(Request $request): string
    {
        $id  = $this->adminUid;
        $row = (new SystemAdmin())
            ->withoutField('password')
            ->find($id);
        empty($row) && $this->error('用户信息不存在');
        if ($request->isPost()) {
            $post = $request->post();
            $this->isDemo && $this->error('演示环境下不允许修改');
            $rule = [];
            $this->validate($post, $rule);
            try {
                $login_type = $post['login_type'] ?? 1;
                if ($login_type == 2) {
                    $ga_secret = (new SystemAdmin())->where('id', $id)->value('ga_secret');
                    if (empty($ga_secret)) $this->error('请先绑定谷歌验证器');
                }
                $save = $row->allowField(['head_img', 'phone', 'remark', 'update_time', 'login_type'])->save($post);
            } catch (\PDOException $e) {
                $this->error('保存失败');
            }
            $save ? $this->success('保存成功') : $this->error('保存失败');
        }
        $this->assign('row', $row);
        $notes = (new SystemAdmin())->notes;
        $this->assign('notes', $notes);
        return $this->fetch();
    }

    /**
     * 修改密码
     * @param Request $request
     * @return string
     */
    public function editPassword(Request $request): string
    {
        $id  = $this->adminUid;
        $row = (new SystemAdmin())
            ->withoutField('password')
            ->find($id);
        if (!$row) {
            $this->error('用户信息不存在');
        }
        if ($request->isPost()) {
            $post = $request->post();
            $this->isDemo && $this->error('演示环境下不允许修改');
            $rule = [
                'password|登录密码'       => 'require',
                'password_again|确认密码' => 'require',
            ];
            $this->validate($post, $rule);
            if ($post['password'] != $post['password_again']) {
                $this->error('两次密码输入不一致');
            }

            try {
                $save = $row->save([
                    'password' => password_hash($post['password'], PASSWORD_DEFAULT),
                ]);
            } catch (Exception $e) {
                $this->error('保存失败');
            }
            if ($save) {
                $this->success('保存成功');
            } else {
                $this->error('保存失败');
            }
        }
        $this->assign('row', $row);
        return $this->fetch();
    }

    /**
     * 设置谷歌验证码
     * @param Request $request
     * @return string
     * @throws Exception
     */
    public function set2fa(Request $request): string
    {
        $id  = $this->adminUid;
        $row = (new SystemAdmin())->withoutField('password')->find($id);
        if (!$row) $this->error('用户信息不存在');
        // You can see: https://gitee.com/wolf-code/authenticator
        $ga = new \Wolfcode\Authenticator\google\PHPGangstaGoogleAuthenticator();
        if (!$request->isAjax()) {
            $old_secret = $row->ga_secret;
            $secret     = $ga->createSecret(32);
            $ga_title   = $this->isDemo ? 'EasyAdmin8演示环境' : '可自定义修改显示标题';
            $dataUri    = $ga->getQRCode($ga_title, $secret);
            $this->assign(compact('row', 'dataUri', 'old_secret', 'secret'));
            return $this->fetch();
        }
        $this->isDemo && $this->error('演示环境下不允许修改');
        $post      = $request->post();
        $ga_secret = $post['ga_secret'] ?? '';
        $ga_code   = $post['ga_code'] ?? '';
        if (empty($ga_code)) $this->error('请输入验证码');
        if (!$ga->verifyCode($ga_secret, $ga_code)) $this->error('验证码错误');
        $row->ga_secret  = $ga_secret;
        $row->login_type = 2;
        $row->save();
        $this->success('操作成功');
    }

    ///出勤统计
    function attendance()
    {
        $year = date("Y");
        $monthArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
        $sum_array = [];
        $leave_array = [];
        $rest_array = [];
        $work_array = [];
        $drive_array = [];
        $sum = 0;
        $leave = 0;
        $rest = 0;
        $work = 0;
        $drive = 0;
        //$date = $year . "-" . "2". '-01';
        for ($i = 0; $i < count($monthArray); $i++) {
            $month = $monthArray[$i];
            $date = $year . "-" . $month . '-01';
            $model = WorkAttendanceStatistics::where("statistics_date", $date)->findOrEmpty();
            if ($model->isEmpty()) {
                $sum = 0;
                $leave = 0;
                $rest = 0;
                $work = 0;
                $drive = 0;
            } else {
                $sum = $model->sum_duration;
                $leave = $model->leave_days;
                $rest = $model->rest_days;
                $work = $model->work_days;
                $drive = $model->drive_days;
            }

            array_push($sum_array, $sum);
            array_push($leave_array, $leave);
            array_push($rest_array, $rest);
            array_push($work_array, $work);
            array_push($drive_array, $drive);
        }
        $back = [
            array("name" => "出勤", "data" => $sum_array),
            array("name" => "请假", "data" => $leave_array),
            array("name" => "休息", "data" => $rest_array),
            array("name" => "上班", "data" => $work_array),
            array("name" => "开车", "data" => $drive_array),
        ];
        return json($back);
    }

    ///获取星期
    public function week()
    {
        $weekArray = ["日", "一", "二", "三", "四", "五", "六"];
        return $weekArray[date("w", time())];
    }

    ///万年历
    public function wnl()
    {
        $url = 'https://api.52vmy.cn/api/wl/wnl';
        $response = file_get_contents($url);
        return json_decode($response, true);
    }
}
